Jackson এর মাধ্যমে Enum কাস্টমাইজ করা

Java Technologies - জ্যাকসন (Jackson) - Enum হ্যান্ডল করা
193

Jackson লাইব্রেরি ডিফল্টভাবে Java Enum কে JSON-এ serialize এবং deserialize করতে পারে। তবে কখনো কখনো আপনাকে Enum-এর ডিফল্ট serialization বা deserialization কাস্টমাইজ করতে হতে পারে। Jackson Enum কাস্টমাইজ করার জন্য অনেক ফিচার সরবরাহ করে, যেমন @JsonValue, @JsonCreator, এবং কাস্টম serializers/deserializers।


ডিফল্ট Enum Serialization এবং Deserialization

ডিফল্টভাবে, Jackson Enum-এর name (যেমন, Enum.name()) serialize করে।

উদাহরণ:

import com.fasterxml.jackson.databind.ObjectMapper;

public class DefaultEnumExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Enum Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);

        // Enum Deserialization
        Status deserializedStatus = mapper.readValue("\"ACTIVE\"", Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

enum Status {
    ACTIVE, INACTIVE, PENDING
}

আউটপুট:

Serialized JSON: "ACTIVE"
Deserialized Enum: ACTIVE

1. @JsonValue এর মাধ্যমে Enum Serialization কাস্টমাইজ করা

@JsonValue ব্যবহার করে Enum কে কাস্টম string, number বা অন্য ফরম্যাটে serialize করা যায়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    @JsonValue
    public String getDisplayName() {
        return displayName;
    }
}

public class JsonValueExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);
    }
}

আউটপুট:

Serialized JSON: "Active Status"

2. @JsonCreator এর মাধ্যমে Enum Deserialization কাস্টমাইজ করা

@JsonCreator ব্যবহার করে JSON থেকে Enum কে কাস্টমভাবে deserialize করা যায়।

উদাহরণ:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    @JsonValue
    public String getDisplayName() {
        return displayName;
    }

    @JsonCreator
    public static Status forValue(String value) {
        for (Status status : values()) {
            if (status.displayName.equalsIgnoreCase(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid Status: " + value);
    }
}

public class JsonCreatorExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Deserialization
        Status status = mapper.readValue("\"Active Status\"", Status.class);
        System.out.println("Deserialized Enum: " + status);
    }
}

আউটপুট:

Deserialized Enum: ACTIVE

3. Enum Serialization এবং Deserialization কাস্টম Serializer/Deserializer ব্যবহার করে

Jackson-এ কাস্টম Serializer এবং Deserializer তৈরি করে Enum কাস্টমাইজ করা যায়।

Serializer এবং Deserializer তৈরি:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;

// Custom Serializer
class StatusSerializer extends JsonSerializer<Status> {
    @Override
    public void serialize(Status status, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(status.getDisplayName().toUpperCase());
    }
}

// Custom Deserializer
class StatusDeserializer extends JsonDeserializer<Status> {
    @Override
    public Status deserialize(com.fasterxml.jackson.core.JsonParser p, com.fasterxml.jackson.databind.DeserializationContext ctxt)
            throws IOException {
        String value = p.getValueAsString();
        for (Status status : Status.values()) {
            if (status.getDisplayName().equalsIgnoreCase(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid Status: " + value);
    }
}

// Enum with Custom Serializer/Deserializer
@JsonSerialize(using = StatusSerializer.class)
@JsonDeserialize(using = StatusDeserializer.class)
enum Status {
    ACTIVE("Active Status"),
    INACTIVE("Inactive Status"),
    PENDING("Pending Status");

    private final String displayName;

    Status(String displayName) {
        this.displayName = displayName;
    }

    public String getDisplayName() {
        return displayName;
    }
}

ব্যবহার:

public class CustomSerializerDeserializerExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization
        Status status = Status.ACTIVE;
        String json = mapper.writeValueAsString(status);
        System.out.println("Serialized JSON: " + json);

        // Deserialization
        Status deserializedStatus = mapper.readValue("\"ACTIVE STATUS\"", Status.class);
        System.out.println("Deserialized Enum: " + deserializedStatus);
    }
}

আউটপুট:

Serialized JSON: "ACTIVE STATUS"
Deserialized Enum: ACTIVE

4. JSON ফিল্ডের মাধ্যমে Enum Map করা

যদি JSON এ Enum ফিল্ড অন্য কোনো ফিল্ডের মান অনুসারে নির্ধারিত হয়, তাহলে এটি কাস্টমভাবে পরিচালনা করতে হয়।

উদাহরণ:

enum PaymentStatus {
    SUCCESS, FAILURE, PENDING
}

class Payment {
    private String transactionId;
    private PaymentStatus status;

    // Getters and Setters
    public String getTransactionId() {
        return transactionId;
    }

    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }

    public PaymentStatus getStatus() {
        return status;
    }

    public void setStatus(PaymentStatus status) {
        this.status = status;
    }
}

public class PaymentExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // JSON to Object
        String json = """
                      {
                          "transactionId": "TXN12345",
                          "status": "SUCCESS"
                      }
                      """;
        Payment payment = mapper.readValue(json, Payment.class);
        System.out.println("Payment Status: " + payment.getStatus());
    }
}

আউটপুট:

Payment Status: SUCCESS

Jackson-এর মাধ্যমে Enum serialization এবং deserialization কাস্টমাইজ করতে:

  1. @JsonValue এবং @JsonCreator সাধারণত সহজ এবং কার্যকর।
  2. কাস্টম Serializer/Deserializer জটিল কেসের জন্য প্রয়োজন।
  3. API-এর ভিন্ন ভিন্ন কনটেক্সটে Enum কাস্টমাইজ করার জন্য কাস্টমাইজেশন গুরুত্বপূর্ণ।

আপনার প্রয়োজনের উপর নির্ভর করে সঠিক পদ্ধতি নির্বাচন করুন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...